import axios from 'axios'
import store from '@/store/index'
import { Message } from 'element-ui'
import router from '@/router/index'
import qs from 'qs'
// creat创建axios实例
const request = axios.create({
  // timeout: 2000
})
function getBaseURL (url) {
  if (url.startsWith('/boss')) {
    return 'http://eduboss.lagou.com'
  } else {
    return 'http://edufront.lagou.com'
  }
}
// 设置请求的拦截器
request.interceptors.request.use(function (config) {
  console.log(config)
  //  判断confug.url的前缀，来进行请求八色URL的设置
  config.baseURL = getBaseURL(config.url)
  // 统一设置token
  const { user } = store.state
  if (user && user.access_token) {
    config.headers.Authorization = user.access_token
  }
  return config
})
// 存储是否正在更新token的状态
let isRefreshing = false
// 存储因为等待token而挂起的请求
let hangupRequests = []
// 设置响应的拦截器
request.interceptors.response.use(function (response) {
  // 状态码为2XX会执行这里
  // console.log('响应成功了', response)
  return response
}, function (error) {
  console.log('失败了')
  if (error.response) {
    // 请求发送成功，响应接收完毕，但状态码为失败的情况
    // 判断失败的状态码情况（主要处理401情况）
    const { status } = error.response
    let errorMessage = ''
    if (status === 400) {
      errorMessage = '请求参数错误'
    } else if (status === 401) {
      // errorMessage = 'Token无效'
      if (!store.state.user) {
        // 没有token信息
        // 跳转登录页
        router.push({
          name: 'login',
          query: {
            // currentRoute就是存储了路由信息的对象
            redirect: router.currentRoute.fullPath
          }
        })
        return Promise.reject(error)
      }
      // 检测是否已经存在正在刷新token的请求
      if (isRefreshing) {
        return hangupRequests.push(() => {
          // 当前函数调用后，会自动发送本次失败的请求
          request(error.config)
        })
      }
      isRefreshing = true
      // 有token，但是无效token
      // 发送请求，获取新的token，使用参数refresh_token
      return request({
        method: 'POST',
        url: '/front/user/refresh_token',
        data: qs.stringify({
          refreshtoken: store.state.user.refresh_token
        })
      }).then(res => {
        // 刷新token失败
        if (res.data.state !== 1) {
          // 清除无效的用户信息
          store.commit('setUser', null)
          // 跳转到登录页
          router.push({
            name: 'login',
            query: {
              // currentRoute就是存储了路由信息的对象
              redirect: router.currentRoute.fullPath
            }
          })
          return Promise.reject(error)
        }
        // 刷新token成功
        // 存储新的user
        store.commit('setUser', res.data.content)
        // // 重新发送失败的请求
        // return request(error.config)
        // 重新发送失败的请求
        hangupRequests.forEach(fn => {
          fn()
        })
        // 清除hangupRequests内容
        hangupRequests = []
        // 将本次请求发送
        return request(error.config)
      }).catch(error => {
        console.log(error)
      }).finally(() => {
        isRefreshing = false
      })
    } else if (status === 403) {
      errorMessage = '没有权限，请联系管理员'
    } else if (status === 404) {
      errorMessage = '请求资源不存在'
    } else if (status >= 500) {
      errorMessage = '服务器错误，请联系管理员'
    }
    Message.error(errorMessage)
  } else if (error.request) {
    // 请求发送成功，但是未收到响应
    Message.error('请求超时')
  } else {
    // 意料之外的错误
    Message.error(error.message)
  }
  // 将本次请求的错误对象继续向后抛出
  return Promise.reject(error)
})
export default request
